package cn.xxi.ai.application.dto;

import cn.xxi.ai.application.constant.MessageRole;
import cn.xxi.ai.application.entity.Conversation;
import cn.xxi.ai.application.entity.MessageData;
import cn.xxi.ai.common.entity.BaseEntity;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import lombok.Data;

/**
 * 消息实体类
 */
@Data
public class Message extends BaseEntity {

    /** 对话 */
    private Conversation conversation;

    /** 发送方 */
    private MessageRole role;

    /** 内容 */
    private String content;

    /** 实际内容 */
    private String actualContent;

    /**
     * 数据字段，包含多态子类信息，
     * 通过 JSON 的 type 属性标识具体类型
     */
    @JsonTypeInfo(
        use = JsonTypeInfo.Id.SIMPLE_NAME,
        include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
        property = "type"
    )
    private MessageData data;

    /** token 用量 */
    private Integer tokenUsage;

    /** 父消息 */
    private Message parent;

    /**
     * 根据当前 Message 拷贝一份，并替换成 Text 类型数据和指定内容等
     *
     * @param messageId   新消息 id
     * @param content     新内容
     * @param tokenUsage  token 用量，可为空
     * @return 新的 Message 实例
     */
    public Message toText(Long messageId, String content, Integer tokenUsage) {
        Message copy = new Message();
        copy.setId(messageId);
        copy.setConversation(this.conversation);
        copy.setRole(this.role);
        copy.setActualContent(this.actualContent);
        copy.setParent(this.parent);
        copy.setContent(content);
        copy.setTokenUsage(tokenUsage);
        copy.setData(new Text());
        return copy;
    }

}
